﻿using System.ComponentModel.DataAnnotations;

namespace wwl.Contract.Dtos.Requests.Rbac
{
  /// <summary>
  /// 创建租户的请求模型（前端→后端的输入参数契约）
  /// 封装权限模块（Rbac）中租户创建场景的专用数据交互载体，封装前端传递的租户基础信息
  /// </summary>
  /// <remarks>
  /// 属于契约层的请求模型，仅包含创建租户所需的必要业务字段，与领域实体（<see cref="Domain.Entities.Rbac.Tenant"/>）解耦
  /// 用于接收前端表单提交的租户数据，通过数据注解（DataAnnotations）实现基础参数校验
  /// </remarks>
  public class CreateTenantRequest
  {
    /// <summary>
    /// 租户编码（业务唯一标识）
    /// </summary>
    /// <remarks>
    /// 1. 业务约束：不可为空且长度不超过64字符，用于系统内唯一标识租户（如数据隔离、权限控制）
    /// 2. 与领域实体映射：对应 <see cref="Domain.Entities.Rbac.Tenant.TenantCode"/>，但仅传递数据，不包含领域规则
    /// 3. 校验逻辑：通过 <see cref="RequiredAttribute"/> 和 <see cref="StringLengthAttribute"/> 进行基础校验，
    ///    更复杂的唯一性校验由领域服务（<see cref="ITenantService"/>）调用仓储完成
    /// </remarks>
    [Required(ErrorMessage = "租户编码不能为空")]
    [StringLength(64, ErrorMessage = "租户编码长度不能超过64个字符")]
    public string TenantCode { get; set; } = string.Empty;

    /// <summary>
    /// 租户名称（显示用标识）
    /// </summary>
    /// <remarks>
    /// 1. 业务约束：不可为空且长度不超过128字符，用于前端展示和业务沟通（如租户列表、操作日志）
    /// 2. 与领域实体映射：对应 <see cref="Domain.Entities.Rbac.Tenant.TenantName"/>
    /// 3. 校验逻辑：基础非空和长度校验，确保数据合法性后传递至领域层
    /// </remarks>
    [Required(ErrorMessage = "租户名称不能为空")]
    [StringLength(128, ErrorMessage = "租户名称长度不能超过128个字符")]
    public string TenantName { get; set; } = string.Empty;

    /// <summary>
    /// 租户备注信息（可选）
    /// </summary>
    /// <remarks>
    /// 1. 业务用途：存储租户的附加说明（如创建原因、特殊配置），非必填项
    /// 2. 与领域实体映射：对应 <see cref="Domain.Entities.Common.BaseEntity.Remarks"/>
    /// 3. 可空设计：允许前端不传递该字段，后端接收时默认为null，映射至领域实体时转为空字符串
    /// </remarks>
    [StringLength(50, ErrorMessage = "备注信息长度不能超过50个字符")]
    public string? Remarks { get; set; }
  }
}